// app.js
const cartSync = require('./utils/cart-sync')
const request = require('./utils/request')

App({
  onLaunch() {
    console.log('餐饮点餐小程序启动')
    
    // 获取系统信息
    this.getSystemInfo()
    
    // 检查网络状态
    this.checkNetworkStatus()
    
    // 检查登录状态
    this.checkLoginStatus()
    
    // 加载购物车数据
    this.loadCartData()
    
    // 获取用户位置信息
    this.getUserLocation()
    
    // 监听网络状态变化
    wx.onNetworkStatusChange(this.onNetworkStatusChange.bind(this))
  },

  globalData: {
    userInfo: null,
    token: null,
    location: {
      latitude: 39.90923, // 默认北京天安门位置
      longitude: 116.397428
    },
    cart: [], // 购物车
    apiBase: 'http://localhost:8080/api', // 后端API地址
    
    // 数据同步相关
    cartListeners: [], // 购物车监听器
    orderListeners: [], // 订单监听器
    userListeners: [], // 用户信息监听器
    
    // 系统信息
    systemInfo: null,
    networkAvailable: true
  },
  
  // 获取系统信息
  getSystemInfo() {
    try {
      const systemInfo = wx.getSystemInfoSync()
      this.globalData.systemInfo = systemInfo
      console.log('系统信息:', systemInfo)
    } catch (e) {
      console.error('获取系统信息失败:', e)
    }
  },
  
  // 检查网络状态
  checkNetworkStatus() {
    wx.getNetworkType({
      success: (res) => {
        const networkType = res.networkType
        this.globalData.networkAvailable = networkType !== 'none'
        console.log('网络状态:', networkType)
      }
    })
  },

  // 检查登录状态
  checkLoginStatus() {
    const token = wx.getStorageSync('token')
    const userInfo = wx.getStorageSync('userInfo')
    
    if (token && userInfo) {
      this.globalData.token = token
      this.globalData.userInfo = userInfo
      
      // 初始化购物车同步
      if (userInfo.id) {
        cartSync.init(userInfo.id)
        
        // 登录后，尝试合并本地和云端购物车
        cartSync.mergeCart().then(merged => {
          if (merged) {
            console.log('购物车数据已合并')
            this.notifyCartUpdate()
          }
        })
      }
    }
  },

  // 加载购物车数据
  loadCartData() {
    const cart = wx.getStorageSync('cart')
    if (cart && Array.isArray(cart)) {
      this.globalData.cart = cart
    }
  },

  // 获取用户位置
  getUserLocation() {
    const that = this
    wx.getLocation({
      type: 'gcj02',
      success(res) {
        that.globalData.location = {
          latitude: res.latitude,
          longitude: res.longitude
        }
        console.log('获取位置成功:', res)
      },
      fail(err) {
        console.log('获取位置失败:', err)
        // 使用默认位置
      }
    })
  },

  // 设置用户信息
  setUserInfo(userInfo, token) {
    this.globalData.userInfo = userInfo
    this.globalData.token = token
    
    // 存储到本地
    wx.setStorageSync('userInfo', userInfo)
    wx.setStorageSync('token', token)
    
    // 单独存储用户ID，便于API调用
    if (userInfo && userInfo.id) {
      wx.setStorageSync('userId', userInfo.id)
      
      // 初始化购物车同步
      cartSync.init(userInfo.id)
      
      // 登录后，尝试合并本地和云端购物车
      cartSync.mergeCart().then(merged => {
        if (merged) {
          console.log('购物车数据已合并')
          this.notifyCartUpdate()
        }
      })
    }
    
    // 通知用户信息更新
    this.notifyUserUpdate()
  },

  // 清除用户信息
  clearUserInfo() {
    this.globalData.userInfo = null
    this.globalData.token = null
    
    wx.removeStorageSync('userInfo')
    wx.removeStorageSync('token')
    wx.removeStorageSync('userId')
    
    // 停止购物车同步
    cartSync.stopAutoSync()
    
    // 通知用户信息更新
    this.notifyUserUpdate()
  },

  // 添加商品到购物车
  addToCart(product, storeId) {
    const cart = this.globalData.cart
    const existingItem = cart.find(item => 
      item.productId === product.id && item.storeId === storeId
    )

    if (existingItem) {
      existingItem.quantity += 1
    } else {
      cart.push({
        productId: product.id,
        storeId: storeId,
        name: product.name,
        price: product.price,
        image: product.imageUrl,
        quantity: 1,
        specifications: product.specifications || [] // 确保specifications是数组
      })
    }

    this.globalData.cart = cart
    wx.setStorageSync('cart', cart)
    
    // 通知购物车更新
    this.notifyCartUpdate()
    
    // 标记需要同步
    cartSync.markForSync()
    
    console.log('添加商品到购物车:', {
      productId: product.id,
      storeId: storeId,
      name: product.name,
      cartLength: cart.length
    })
  },

  // 从购物车移除商品(减少数量)
  removeFromCart(productId, storeId) {
    const cart = this.globalData.cart
    const existingItem = cart.find(item => 
      item.productId === productId && item.storeId === storeId
    )

    if (existingItem) {
      existingItem.quantity -= 1
      
      // 如果数量为0，则完全移除
      if (existingItem.quantity <= 0) {
        const index = cart.indexOf(existingItem)
        cart.splice(index, 1)
      }
    }
    
    this.globalData.cart = cart
    wx.setStorageSync('cart', cart)
    
    // 通知购物车更新
    this.notifyCartUpdate()
    
    // 标记需要同步
    cartSync.markForSync()
  },

  // 完全移除商品
  removeProductFromCart(productId, storeId) {
    let cart = this.globalData.cart
    cart = cart.filter(item => 
      !(item.productId === productId && item.storeId === storeId)
    )
    
    this.globalData.cart = cart
    wx.setStorageSync('cart', cart)
    
    // 通知购物车更新
    this.notifyCartUpdate()
    
    // 标记需要同步
    cartSync.markForSync()
  },

  // 更新购物车商品数量
  updateCartQuantity(productId, storeId, quantity) {
    const cart = this.globalData.cart
    const item = cart.find(item => 
      item.productId === productId && item.storeId === storeId
    )

    if (item) {
      if (quantity <= 0) {
        this.removeFromCart(productId, storeId)
      } else {
        item.quantity = quantity
        this.globalData.cart = cart
        wx.setStorageSync('cart', cart)
        
        // 通知购物车更新
        this.notifyCartUpdate()
        
        // 标记需要同步
        cartSync.markForSync()
      }
    }
  },

  // 清空购物车
  clearCart() {
    this.globalData.cart = []
    wx.removeStorageSync('cart')
    
    // 通知购物车更新
    this.notifyCartUpdate()
    
    // 同步到云端
    if (this.globalData.userInfo && this.globalData.userInfo.id) {
      cartSync.clearCart()
    }
  },

  // 获取购物车商品总数
  getCartItemCount() {
    return this.globalData.cart.reduce((total, item) => total + item.quantity, 0)
  },

  // 计算购物车总金额
  getCartTotal() {
    return this.globalData.cart.reduce((total, item) => 
      total + (item.price * item.quantity), 0
    )
  },

  // ==================== 数据同步机制 ====================
  
  // 添加购物车监听器
  addCartListener(callback) {
    if (typeof callback === 'function') {
      this.globalData.cartListeners.push(callback)
    }
  },

  // 移除购物车监听器
  removeCartListener(callback) {
    const index = this.globalData.cartListeners.indexOf(callback)
    if (index > -1) {
      this.globalData.cartListeners.splice(index, 1)
    }
  },

  // 通知购物车更新
  notifyCartUpdate() {
    this.globalData.cartListeners.forEach(callback => {
      try {
        callback(this.globalData.cart)
      } catch (error) {
        console.error('购物车监听器回调错误:', error)
      }
    })
  },

  // 添加订单监听器
  addOrderListener(callback) {
    if (typeof callback === 'function') {
      this.globalData.orderListeners.push(callback)
    }
  },

  // 移除订单监听器
  removeOrderListener(callback) {
    const index = this.globalData.orderListeners.indexOf(callback)
    if (index > -1) {
      this.globalData.orderListeners.splice(index, 1)
    }
  },

  // 通知订单更新
  notifyOrderUpdate(orderData) {
    this.globalData.orderListeners.forEach(callback => {
      try {
        callback(orderData)
      } catch (error) {
        console.error('订单监听器回调错误:', error)
      }
    })
  },

  // 添加用户信息监听器
  addUserListener(callback) {
    if (typeof callback === 'function') {
      this.globalData.userListeners.push(callback)
    }
  },

  // 移除用户信息监听器
  removeUserListener(callback) {
    const index = this.globalData.userListeners.indexOf(callback)
    if (index > -1) {
      this.globalData.userListeners.splice(index, 1)
    }
  },

  // 通知用户信息更新
  notifyUserUpdate() {
    this.globalData.userListeners.forEach(callback => {
      try {
        callback(this.globalData.userInfo)
      } catch (error) {
        console.error('用户信息监听器回调错误:', error)
      }
    })
  },

  // 网络状态变化处理
  onNetworkStatusChange(event) {
    const isConnected = event.isConnected
    const networkType = event.networkType
    
    console.log('网络状态变化:', { isConnected, networkType })
    
    this.globalData.networkAvailable = isConnected
    
    // 当网络重新连接时，尝试同步购物车
    if (isConnected && this.globalData.userInfo && this.globalData.userInfo.id) {
      cartSync.syncToCloud()
    }
  },

  // 安全获取用户ID
  getSafeUserId() {
    if (this.globalData.userInfo && this.globalData.userInfo.id) {
      return this.globalData.userInfo.id
    }
    return wx.getStorageSync('userId') || null
  }
}) 